Linux数据备份技术

GO


1. scp工具

scp用来拷贝用的,可远程和本地相互之间都可以,与rsync差不多,但是它不支持增量备份。

用法如下:

  • scp是由openssh-clients包支持的,安装这个包就可以使用scp了,但是远程备份的时候双方都必须安装这个包。
  • scp -r a/ 192.168.1.12:/tmp/b/ 把a目录拷贝到IP的/tmp/下更名为b,IP前不加用户名默认使用当前用户。
  • scp -r a/ root@192.168.1.12"/tmp/a/" 从本地拷贝到远程
  • scp -r 192.168.1.12:/tmp/a/ ./a/ 从远程拷贝到本地

2. rsync工具

2.1. 介绍

在Linux 系统下的数据备份的工具有很多,但其实只用一种就可以满足所有的备份工作,那就是rsync这个工具。从字面上的意思可以理解为remote sync(远程同步),这样可以理解的更深刻一些。

rsync工具不仅可以远程同步数据(类似于scp),当然还可以本地同步数据(类似于cp)。但不同于两者的是,rsync工具不会覆盖以前的数据(如果数据已经存在),它会先判断已经存在的数据和新数据有什么不同,只有不同时才会把不同的部分覆盖掉。远程备份和增量备份是它的优势。

如果Linux系统中没有这个工具,请先安装它:yum install -y rsync

2.2. 使用

使用格式:

  • rsync [选项] 源 目标 ——————–//本地同步文件
  • rsync [选项] 源 userbname@ip:目标 ——-//从本地上传到远程去
  • rsync [选项] username@ip:源文件 目标 —-//从远程下载到本地来
  • rsync [选项] 源 username@ip::模块名
  • rsync [选项] username@ip::模块名 目标

后两种的两种格式中使用了两个冒号,这种方式和前面的方式的不同在于验证方式的不同。后面会再详细介绍。

常用选项:

  • (常用)-a 归档模式,表示以递归方式传输文件,并保持所有属性。相当于选项 -rlptgoD。这个选项后面可以跟一个--no-OPTION这个表示关闭-rlptgoD中的某一个,例如-a --no-l 在a选项中去除l选项
  • (常用)-v 显示信息,显示文件拷贝的速率、文件数量等状态信息
  • (常用)-z 压缩传输
  • (常用)--delete 删除那些DST中SRC没有的文件
  • (常用)--exclude=PATTERN 指定排除不需要传输的文件,等号后面跟文件名,支持通配符(如*.txt)
  • (常用)--password-file=filename 指定密码文件
  • (常用)rsync --daemon 后台模式启动
    • rsync --daemon --help 可查看帮助文件
    • rsync --daemon --config=/etc/rsyncd.conf 指定配置文件,默认使用/etc/rsyncd.conf配置文件
  • -r 针对目录,对子目录以递归模式处理
  • -l 针对软链接文件来使用,保持软链接文件的本身类型
  • -L 像对待常规文件一样处理软链接,如果SRC中有软链接文件,则把软链接所指向的源文件拷贝
  • -u 加上这个选项后将会把DST中比SRC还新的文件排除掉,不会覆盖
  • -p 保留权限
  • -t 保留时间属性
  • -g 保留所属组信息
  • -o 保留所属主信息
  • -D 保持设备文件信息(只针对超级用户使用,目前还不理解)
  • -P或--progress 在同步的过程中可以看到同步的过程状态,比如统计要同步的文件数量、同步的文件传输速度等等。
  • --bwlimit=100 限速,最大传输速度为100kb

2.3. 一些重要的实验

  • 建立目录以及文件
    • mkdir rsync
    • cd rsync
    • mkdir test1
    • cd test1
    • touch 1 2 3 /root/123.txt
    • ln -s /root/123.txt ./123.txt
    • ls -l
    • 建立这些文件的目的就是为了做实验做一些准备工作。
  • 使用-a选项
    • rsync -a test1 test2
    • ls test2
    • ls test2/test1/
    • 这里有一个问题,就是本想把test1目录直接拷贝成test2目录,可结果rsync却新建了test2目录然后把test1放到了test2当中。为了避免这样的情况发生,可以这样做:
    • rm -rf test2
    • rsync -a test1/ test2/
    • ls -l test2/
    • 加一个斜杠就好了,所以我建议你在使用rsync备份目录时要养成加斜杠的习惯。
    • 在上面讲了-a选项等同于-rlptgoD,而且-a还可以和–no-OPRIN一并使用。
  • 下面来看看-l选项的作用
    • rsync -av --no-l test1/ test2/
    • 使用-v选项看来就是很方便,上例告诉我们跳过了非普通文件123.txt,其实123.txt是一个软链接文件,如果不使用-l选项则不理会软链接文件。
    • 虽然加上-l选项会把软链接文件给拷贝过去,但是软链接的目标文件却没有拷贝过去,有时候咱们指向拷贝软链接文件所指向的目标文件,那这时候该怎么办呢?
  • 使用-L选项
    • rsync -avL test1/ test2/
    • ls -l test2/
    • 加上-L选项就可以把SRC中软链接的目标文件给拷贝到DST。
  • 使用-u
    • 首先查看一下test/1和test2/1的创建时间(肯定是一样的),然后使用touch修改一下test2/1的创建时间(此时test2/1要比/test1/1的创建时间晚了一些)。如果不加-u选项的花,会把test2/1的创建时间变成和test1/1的创建时间一样。这样讲也许会让人迷糊,不妨看一看:
    • ll test1/1 test2/1 两者之间的创建时间是一样的,下面修改test2/1的创建时间,然后不加-u同步
    • touch test2/1
    • ll test2/1
    • rsync -av test1/ test2/
    • ll test2/1
    • test2/1的创建时间又变成和test1/1的创建时间一样了。下面加上-u选项再看看结果是怎样的
    • touch test2/1
    • ll test2/1
    • rsync -avu test1/ test2/
    • ll test1/1 test2/1
    • 加上-u选项后,不会再把test1/1同步为test2/1了,这就是-u选项的妙用。
  • 使用--delete选项
    • 首先删除test1/123.txt rm -rf test1/123.txt
    • `ls test1/
    • 然后把test1/目录同步到test2/目录下 rsync -av test1/ test2/
    • ls test2/
    • test2/目录下并没有删除掉123.txt,下面加上–delete选项 rsync -av --delete test1/ test2/
    • ls test2/
    • test2/目录下的123.txt也被删除了,这就是–delete选项的用处。
    • 还有一种情况就是如果在DST增加文件,而SRC当中没有这些文件,同步时加上–delete选项后同样会删除新增的文件。
    • touch test2/4
    • ls test1/ test2/
    • rsync -a --delete test1/ test2/
    • ls test1/ test2/
  • 使用–exclude选项
    • touch test1/4
    • rsync -a --exclude="4" test1/ test2/
    • ls test1/ test2/
    • 另外还可以使用匹配字符*
    • touch test1/1.txt test1/2.txt
    • ls test1/ test2/
    • rsync -a --progress --exclude="\*.txt" test1/ test2/
    • ls test2/
    • 上例中,连带着使用了–progress选项,这个主要是用来观察rsync同步过程的状态的。
  • 最后简单总结一下,在平时使用rsync同步数据的时候,使用-a选项基本上就可以达到我们想要的效果了,只是有时候有个别的需求,会用到-a -no-OPTION、-u、-L、–delete、–exclude以及–progress这些选项,还有些选项虽然没有介绍,但是在以后的工作中遇到特殊需求了,就去查一下rsync的man文档吧。

2.4. rsync应用实例:通过ssh隧道的方式(干货)

在之前介绍的5种方式当中,第二、第三(一个冒号)就属于通过ssh的方式,这种方式其实就是让用户去登陆到远程机器,然后执行rsync的任务。这就需要准备两台Linux机器,因为用到了ssh,所以必须要安装openssh-clients包才可以,两台机器都安装一下:yum install -y openssh-clients

  • rsync -avL test1/ www@192.168.0.101:/tmp/test2/
    • 这种方式就是前面介绍的第二种方式了,是通过ssh拷贝的数据,需要输入192.168.0.101那台机器WWW账户的密码。
  • rsync -avL www@192.168.0.101:/tmp/test2/ ./test3/
    • 这种方式就是第三种拷贝的方式了。

如果ssh服务的默认端口该成别的了,那么如何给rsync指定ssh的端口呢?用这个方式:rsync -avPL -e "ssh -p 端口" 源 目的

以上两种方式如果写到脚本里,备份起来就有麻烦看了,因为要输入密码,脚本本来就是自动的,不可能做到。但是不代表没有解决办法,那就是通过密钥验证,密钥不设立密码就ok了。方法如下:

  • 在操作之前我们先讲明主机信息:192.168.0.10(主机名Aming-1)和192.168.0.101(主机名Aming),需要从Aming-1上拷贝数据到Aming上。首先确认一下Aming-1上是否有这个文件/root/.ssh/id_rsa.pub
  • 如果没有这个文件,按照下面的方法生成:
    • ssh-keygen
    • 在这个过程中会有一些交互的过程,它首先提示要输入这个密钥的密码,出于安全考虑应该定义个没密码,但是我们的目的就是为了自动化同步数据,所以这里不输入任何密码,直接回车,即密码为空。最后则生成了私钥(/root/.ssh/id_rsa)和公钥(/root/.ssh/id_rsa.pub)。
    • 把公钥文件的内容拷贝到目标机器上:cat .ssh/id_rsa.pub,复制内容
    • 复制主机Aming-1的/root/.ssh/id_rsa.pub文件内容,并粘贴到主机Aming的/home/www/.ssh/authorized_keys中:
      • vi /home/www/.ssh/authorized_keys
      • 在这一步也许您会遇到/home/www/.ssh目录不存在的问题,可以手动创建,并修改目录权限为600,也可以执行ssh-keygen命令生成这个目录。
    • 保存/home/.ssh/authorized_keys文件后,再到主机Aming-1上执行:
      • ssh www@192.168.0.101
      • 现在不用输入密码也可以登陆主机Aming了。
  • 下面先从Aming主机退出来,再从主机Aming-1上执行一下rsync命令试试吧:
    • rsync -av rsync/test1/ www@192.168.0.101:/tmp/test4/

2.5. rsync应用实例:通过后台服务的方式(干货)

这种方式可以理解成这样,在远程主机上建立一个rsync的服务器,在服务器上配置好rsync的各种应用,然后本机作为rsync的一个客户端去连接远程的rsync服务器。

如何去配置一台rsync服务器呢?如下所示:

  • 建立并配置rsync的配置文件/etc/rsyncd.conf

    • vi /etc/rsyncd.conf 加入如下内容:

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      #port=873
      log file=/var/log/rsync.log
      pid file=/var/run/rsyncd.pid
      #address=192.168.0.10
      [test]
      path=/root/rsync
      use chroot=true
      max connections=4
      read only=no
      list=true
      uid=root
      gid=root
      auth users=test
      secrets file=/etc/rsyncd.passwd
      hosts allow=192.168.0.101
    • 其中的配置文件分为两部分:全局配置部分和模块配置部分。全局部分就是几个参数而已,就像上例中的port、log file、pid file、address这些都属于全局配置,而[test]以下的部分就是模块配置部分了。

    • 一个配置文件中可以有多个模块,模块名自定义,格式就像上例中的这样。其实模块中的一些参数例如use chroot、max connections、uid、gid、auth users、secrets file以及hosts allow都可以配置成全局的参数。当然上例所给出的参数并不是全部的,你可以通过man rsyncd.cong获得更多帮助信息。
    • 下面简单解释一下这些参数的意义:
      • port 指定在哪个端口启动rsync服务,默认是873端口
      • log file 指定日志文件
      • pid file 指定pid文件,这个文件的作用涉及到服务的启动以及停止等进程管理操作
      • address 指定启动rsyncd服务的IP,假如你的机器有多个IP,就可以指定其中一个启动rsyncd服务,默认是在全部IP上启动
      • [test] 指定模块名,自定义
      • path 指定数据存放的路径
      • use chroot true|false 默认是true,意思是在传输文件以前首先chroot到path参数所指定的目录下。这样做的原因是实现额外的安全防护,但是缺点是需要以root权限,并且不能备份指向外部的符号链接所指向的目录文件。默认情况下chroot值为true,如果你的数据当中有软链接文件的话建议设置成false
      • max connections 指定最大的连接数,默认是0,即没有限制
      • read only true|false 如果为true则不能上传到该模块指定的路径下
      • list 指定当用户查询该服务器上的可用模块时,该模块是否被列出,设定true列出,false隐藏
      • uid和gid 指定传输文件时,以哪个用户和组的身份传输
      • auth users 至i的嗯传输时要使用的用户名
      • secrets file 指定密码文件,该参数连同上面的参数如果不指定则不使用密码验证,注意该密码文件的权限一定要是600
      • hosts allow 指定被允许连接该模块的主机,可以是IP或者网段,如果是多个,之间用空格隔开
  • 编辑secrets file,保存后修改权限为600,如果权限不对,不能完成同步
    • cat /etc/rsyncd.passwd
    • chmod 600 /etc/rsyncd.passwd
  • 启动rsyncd服务
    • rsync --daemon --config=/etc/rsyncd.conf
  • 启动后,可以查看一下日志,并查看端口是否启动:
    • cat /var/log/rsync.log
    • netstat -lnp | grep 873
  • 如果想开机启动,请把命令rsync --daemon --config=/etc/rsyncd.conf写入到/etc/rc.d/rc.local文件
  • 到另一台机器上测试:
    • rsync -avL test@192.168.0.10::test/test1/ /tmp/test5/
  • 有一个选项叫做”use chroot”默认为true,如果是true,同步的文件中如果有软链接,则会有问题,而把主机Aming-1的rsync配置文件修改一下,把该配置语句的值设置为false,这样就没有任何问题了。
  • 另外,修改玩rsyncd.conf配置文件后不需要重启rsyncd服务,这是rsync的一个特定机制,配置文件是即时生效的。

  • 可以通过这个命令列出来服务端可使用的rsync的模块:rsync IP::

2.6. 最后的说明

上面的那个例子中,都有输入密码,这样同样也不能写入到脚本中自动执行,其实这种方式也是可以不用手动输入密码的,它有两种实现方式:

  1. 指定密码文件
    • 在客户端上,也就是主机Aming上,编辑一个密码文件:vim /etc/pass,在其中加入test用户的密码,保存,修改密码文件的权限为600
    • 在同步的时候,指定一下密码文件,就可以省去输入密码的步骤了
      • rsync -avL test@192.168.0.10::test/test1/ /tmp/test8/ --password-file=/etc/pass
  2. 在rsync服务端不指定用户
    • 在服务端上,也就是主机Aming-1上,修改配置文件rsyncd.conf,删除关于认证账户的配置项(auth user和secrets file这两行),如下:
      • sed -i 's/auth users/#auth users/;s/secrets file/#secrets file/' /etc/rsyncd.conf
      • 上面这条操作就是在文件/etc/rsyncd中把auth users和secrets file这两行的最前面加一个#号,这表示将这两行作为注释,使其失去意义。
        然后在到客户端上,也就是Aming上进行测试,如下:
      • rsync -avL test@192.168.0.10::test/test1/ /tmp/test9/
      • 注意这里不用再加test这个用户了,默认是以root身份复制的。现在登陆时已经不需要输入密码了。

3. rsync扩展知识

3.1. rsync只同步指定类型的文件

需求:同步某个目录下所有的图片(.jpg),该目录下有很多其它类型的文件,但是只想同步.jpg文件。

rsync有一个–exclude可以排除指定文件,还有个–include选项的作用正好和–exclude相反。那直接使用–include=”*.jpg”是否可以呢?

rsync -av --include="\*.jpg" /src/ /des/

实验证明,这样是不对的。而正确答案是:rsync -av --include=".jpg" --exclude= /src/ /des/

3.2. rsync如何在远程自动创建目录

默认情况下,使用rsync的时候,不能自动创建级联目录。比如rsync -a /data/1/2/3/1.txt 1.1.1.1.:/date/1/2/3/1.txt这样会报错的。

所以改一改上面的命令:rsync -a /data/1/2/3/1.txt 1.1.1.1:/data/这样同样也达不到我们想要的效果,这样虽然不再报错,但是这样只是把1.txt放到了1.1.1.1:/data/目录下。

rsync有个选项那就是-R,这个选项会帮助我们自动创建级联目录。所以,上边的命令应该改成这样:rsync -aR /data/1/2/3/1.txt 1.1.1.1:/data/这样就会在1.1.1.1:/data/目录下创建1/2/3/这样的级联目录,类似mkdir -p

3.3. rsync根据一个文件列表文档来同步

有时候,有这样的需求,就是根据一个文档中的文件列表来同步文件。举一个例子,1.txt是文件列表,内容如下:

1
2
3
/data/a/a.txt
/data/b.txt
/data/c/b/c.txt

那么同步的命令应该是:rsync -av --files-from=1.txt / ip::module/

需要注意的是,1.txt中如果写全局路径,那么source目录需要写成/


OK

0%